# coding:utf-8
#使用timeit模块中的计时器，计算函数时间复杂度
from timeit import Timer

'''
数据结构为数据列表形式进行计算：
'''
#li1 = [1,2];
#li2 = [23,5]
#li3 = li1+li2
#li4 = [i for i in range(10000)]
#li5 = list(range(10000))

def t1():
    li = [];
    for i in range(10000):
        li.append(i)


def t2():
    li = [];
    for i in range(10000):
        #第一种效率高，第二种效率低 由于第二种是对两个列表进行操作，第一种是相当于列表中的li.extend()方式
        # li += [i]
        # li = li + li[i]
        li.extend()


def t3():
    li = [i for i in range(10000)]


def t4():
    li = list(range(10000))

def t5():
    li = [];
    for i in range(10000):
        li.insert(0,i);

'''
如何使用Timer:
Timer是测量小段代码执行速度的类

timeit.Timer(stmt='pass',setup='pass',timer=<timer function>)
stmt参数是要测试的代码语句（statment）
setup参数是运行代码时需要的设置
timer参数是一个定时器函数，与平台有关

timeit.Timer.timeit(number=1000000)
Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数，默认为1000000.方法
返回执行代码的平均耗时，一个float类型的秒数

'''

'''
测试结果：
li.append(i):0.978293   很快，都是最佳在末尾
li += [i]:1.578022
[i for i in range(10000)]:0.458236
list(range(10000)):0.199820
li.insert(0,i):21.887562  最慢，跟数据结构有关系（寻找索引插入很快，但放在第一个位置时插入，导致列表中的元素都要移动 所以耗时）  
'''
if __name__=='__main__':
    timer1 = Timer('t1()','from __main__ import t1')
    print('li.append(i):%f'%(timer1.timeit(1000)))

    timer2 = Timer('t2()','from __main__ import t2')
    print('li += [i]:%f'%(timer2.timeit(1000)))

    timer3 = Timer('t3()','from __main__ import t3')
    print('[i for i in range(10000)]:%f'%(timer3.timeit(1000)))

    timer4 = Timer('t4()','from __main__ import t4')
    print('list(range(10000)):%f'%(timer4.timeit(1000)))

    timer5 = Timer('t5()','from __main__ import t5')
    print('li.insert(0,i):%f'%(timer5.timeit(1000)))